--- title: "8、乘积最大" created: 2025-11-28 tags: - 算法 --- # 8、乘积最大 ## 题目 [乘积最大](https://www.lanqiao.cn/paper/3848/problem/169/) ![[image-ea2e0223.png]] ## 思路分析 ![[image-2308c8c7.png]] ```cpp #include using namespace std; typedef long long LL; const int N=1e5+10,mod=1e9+9; deque a; int n,k; int main() { cin>>n>>k; for(int i=0;i>x; a.push_back(x); } sort(a.begin(),a.end()); LL sum=1; int flag=1; if(k&1){//奇数 先拿一个最大的出来 int v=a.back(); a.pop_back(); k--; sum=sum*v%mod; if(sum<0){//如果最大的也是负数 则最后的结果一定为负 flag=-1; } } // for(auto t:a)cout<sum_right){ sum=sum*sum_left%mod; a.pop_front();a.pop_front(); } else{ sum=sum*sum_right%mod; a.pop_back();a.pop_back(); } } cout< using namespace std; typedef long long LL; const int N=1e5+10,mod=1e9+9; deque a; int n,k; int main() { cin>>n>>k; for(int i=0;i>x; a.push_back(x); } sort(a.begin(),a.end()); LL sum=1; int flag=1; if(k&1){ int v=a.back(); a.pop_back(); k--; sum=sum*v%mod; if(sum<0){ flag=-1; } } int T=k/2; while(T--){ int num=a.size()-1; LL sum_left=(LL)a[0]*a[1]; LL sum_right=(LL)a[num]*a[num-1];//这里取模可能会影响大小 注意什么时候取模什么时候不取 别乱加 想清楚 if(flag*sum_left>flag*sum_right){ //负数要在这里处理 他会影响两边的大小 sum=sum_left%mod*sum%mod; //乘前乘后都得取模 a.pop_front();a.pop_front(); } else{ sum=sum_right%mod*sum%mod;//前后都得取 a.pop_back();a.pop_back(); } } cout<